home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / seyon / SeParse.y < prev    next >
Text File  |  1995-05-03  |  2KB  |  106 lines

  1. %{
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include "SeParse.h"
  5.  
  6. void (*callbackProc)();
  7. %}
  8.  
  9. %token <sval> WORD
  10.  
  11. %union {
  12.   char *sval;
  13. }
  14.  
  15. %start Script
  16.  
  17. %%
  18.  
  19. Script        : Script FunCall
  20.             | Empty
  21. ;
  22. FunCall        : FunName '(' ArgList ')' ';'
  23.             { (*callbackProc)(3, NULL); }
  24. ;
  25. FunName        : WORD { (*callbackProc)(1, $1); }
  26. ;
  27. ArgList        : Args
  28.               | Empty
  29. ;
  30. Args        : Args ',' Arg
  31.             | Arg
  32. ;
  33. Arg            : WORD { (*callbackProc)(2, $1); }
  34. ;
  35. Empty        :
  36. ;
  37. %%
  38.  
  39. void
  40. ParseThis(line, callback)
  41.      char     *line;
  42.      void     (*callback)();
  43. {
  44.   callbackProc = callback;
  45.   scSetInputBuffer(line);
  46.   yyparse();
  47. }
  48.  
  49. void yyerror(char *msg)
  50. {
  51.   (*callbackProc)(4, msg);
  52. }
  53.  
  54. #ifdef TEST
  55. void SignalBeginFunction(char *name)
  56. {
  57.   printf("** Function call: %s(", name);
  58. }
  59.  
  60. void SignalArg(char *arg)
  61. {
  62.   char *p = arg;
  63.   printf("\n++Arg: (");
  64.   while (*p) {
  65.     if (isprint(*p))
  66.       putchar(*p);
  67.     else 
  68.       printf("\\0%o", (int)*p);
  69.     p++;
  70.   }
  71.   putchar(')');
  72. }
  73.  
  74. void SignalEndFunction()
  75. {
  76.   printf("\n)\n");
  77. }
  78.  
  79. void
  80. main(int argc, char *argv[])
  81. {
  82.   char long_line[1000];
  83.  
  84.   char input_str[] = "This(is, a, real, funky); script();
  85.             Scripts(); Can(be); Multi(Line, \"Can't they?\");
  86.             Commas(are, no, longer, optional, inside, arglists);
  87.         Scripts(); Can(); contain(\"tabs \\t and backspaces \\b\");
  88.         As(\"Well\\ as Quoted Strings\", and, '\"Quoted Strings inside
  89.         quoted strings\"');
  90.     esc(can, appear, outside, strings, ^z, \\012\\015\\n);
  91.         But(parenthesis, should, match);
  92.   We(\"have a funny way of specifying \\012 chars and even)\"); 
  93.     backslashes( \" \\\\ \");
  94.   new(\"in this version are ^m and ^A ctr-escapes, as in ^S^Q\");
  95.  The(next, line, will, give, a, syntax, error, because, it, has, two, adj, functions,
  96.     without, a, separating, semicolon);
  97.  End() script()";
  98.  
  99.   printf("------ String to parse: \n%s\n\n---- Parsing begins:\n", input_str);
  100.   strcpy(long_line, input_str);
  101.   ParseThis(long_line);
  102.   strcpy(long_line, input_str);
  103.   ParseThis(long_line);
  104. }
  105. #endif TEST
  106.